﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static MyDelegate.Program;

namespace MyDelegate
{
    public class ActionFunc
    {
        public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17);

        public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, in T17, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16, T17 arg17);

        public static void Show()
        {
            {
                DoRichardDelegate doRichard = new DoRichardDelegate(ExeObject);
                ParameterizedThreadStart threadStart = new ParameterizedThreadStart(ExeObject); ///接、/收一个object 参数，没有返回值；

                doRichard.Invoke(null);
                threadStart.Invoke(null);
                //无论是doRichard 还是threadStart  执行委托，都是执行的同一个方法；
                //两个委托做的事儿是一模一样；


                ////问题：
                Thread thread = new Thread(threadStart);
                ////Thread thread1 = new Thread(doRichard); //不允许的；问题：在两个结构，功能完全/同、/的委托；  有可能不能通用的；  不太合理？？？
                //
                // //Why??  类型不一样~~
                // //委托的本质是一个类，  多个委托就是多个不同的类， 这些没有继承关系，所以不能用；
                //
                // ///局部方案
                void ExeObject(object? o)
                {

                }


                //以上问题、微软也发现了；
                //为了能够让委托能通用， 为了不用定义过多的委托；
                //微软提供了两个类功的委托： Action/Func

                //Action: 应对了没有返回值的委托场景；
                //可有可无参数，一定没有返回值的委托；最多可以有16个参数~~ 16个泛型版本
                // 如果想要有17个参数的委托呢？
                //Action action = new Action(() => { });
                Action<int> action1 = new Action<int>(s => { }); //接收一个int类型参数，没有返回值
                Action<int, string> action2 = new Action<int, string>((i, s) => { }); //接收一个int类型参数，没有返回值
                Action<int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object> action3 = null;
                Action<int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, int> action4 = null;

                //这是一个没有返回值的通用委托---如果所有的人需要使用没有返回值的委托的时候，都用Action, 不用定义委托；委托都是同一个类型； 就可以通用了；
                //微软既然提供这个委托，自然是希望我们在以后的编码中，都尽可能使用这些，这样就可以统一了委托的类型；
                //对于以前定义的委托呢？ 咋办？ 解决不了~~ 这些被称为技术上的历史包袱，丢不掉~~  以后在使用委托的时候，就不要自己定义了，直接使用现有提供的委托即可~~


                //委托要有返回值呢？
                //Func：多版本的委托：应对了有返回值的情况；
                //一定有返回值的委托；泛型委托Func中的最后一个类型参数，是作为返回值的类型；前面的类型参数，是作为委托的参数；也提供了最多可以有16个参数；
                //如果需要有17个参数，且有返回值的委托呢？ 可以扩展下呗；
                Func<int> func = new Func<int>(() => { return 10; }); //一个返回值的委托，没有参数；
                Func<int, string> func1 = new Func<int, string>(s => { return "R"; });
                Func<int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, string> func2 = null;

                //17个参数；
                Func<int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, int, string, DateTime, object, object, string> func3 = null;


            }
        }
    }
}
